﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Data.SqlClient;

namespace GAIA_Logica
{

    public class Terreno
    {
        #region Atributos
            /// <summary>
            /// Atributos de la clase
            /// </summary>
            /// 

        private string _unidadMedida;

        public string UnidadMedida
        {
            get { return _unidadMedida; }
            set { _unidadMedida = value; }
        }

        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        private int tipo = 1;

        public int Tipo
        {
            get { return tipo; }
            set { tipo = value; }
        }
        private Localidad localidad;

        public Localidad Localidad
        {
            get { return localidad; }
            set { localidad = value; }
        }
        private double latitud;

        public double Latitud
        {
            get { return latitud; }
            set { latitud = value; }
        }
        private double longitud;

        public double Longitud
        {
            get { return longitud; }
            set { longitud = value; }
        }
        private double tamano;

        public double Tamano
        {
            get { return tamano; }
            set { tamano = value; }
        }
        private string nombre;//folio registro nacional

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        private int habilitado = 1;

        public int Habilitado
        {
            get { return habilitado; }
            set { habilitado = value; }
        }

        private String numFolio = "";

        public String NumFolio
        {
            get { return numFolio; }
            set { numFolio = value; }
        }

        private String tipoTerreno;

        public String TipoTerreno {
            get { return tipoTerreno; }
            set { tipoTerreno = value; }
        }
        
        private List<Segmento> segmentos;

        internal List<Segmento> Segmentos
        {
            get { return segmentos; }
            set { segmentos = value; }
        }

        private String _poblado;

        public String Poblado {

            get { return _poblado; }
            set { _poblado=value;}
        }

        //Conexion a base de datos
        private AcessoBD dba = new AcessoBD(Properties.Settings.Default.GAIA_CON);

        #endregion

        #region Constructor
            public Terreno(double pTamano, int pDistrito, string pNombre, string punidadMedida, string pTipoTerreno,string pPoblado)
            {
                this.tamano = pTamano;
                this.Nombre = pNombre;
                this.UnidadMedida = punidadMedida;
                this.tipoTerreno = pTipoTerreno;
                this.Poblado = pPoblado;
                setLocalidad(pDistrito);
            }

            //Default
            public Terreno() { 
            }

        #endregion

        #region Metodos
            /// <summary>
            /// Obtiene toda la localidad de un terreno, incluido el
            /// distrito, cantón y provincia
            /// </summary>
            /// <param name="id_Distrito"></param>
            /// <returns></returns>
           /* public Localidad getLocalidad(int id_Distrito) {

                return terreno;
            }*/

            public void setLocalidad(int id_Distrito) {
                Localidad = new Localidad();
                Localidad.getLocalicaXDistrito(id_Distrito);
            }

            /*
            /// <summary>
            /// Obtiene el tipo de terreno al pasar el id del 
            /// tipo de terreno por parámetro.
            /// </summary>
            /// <param name="tipoTerreno"></param>
            /// <returns></returns>
            public TipoTerreno getTipoTerreno(int tipoTerreno) {

                return cliente;
            }

            public void setTipoTerreno(int tipoTerreno) { 
                cliente.setTipo(tipoTerreno);
                getTipoTerreno(tipoTerreno);
            }*/

            /// <summary>
            /// Retorna una lista de terrenos
            /// </summary>
            
            public void getTerreno(int pid) {
                string sqlQuery = "Select id,id_tipo,id_distrito,isnull(num_folio,0)num_folio,isnull(latitud,0) latitud," +
                    "isnull(longitud,0) longitud, isnull(tamano,0) tamano,isnull(nombre,'Sin nombre') nombre," +
                    "habilitado,unidad_medicion,tipo_terreno,isnull(poblado,'Sin poblado') poblado " +
                    "from Terrenos where id=" + pid;

                try{
                    SqlDataReader rs = dba.execute_Consulta(sqlQuery,null);

                    
                    if (rs != null && rs.Read())
                    {
                        this.Id=rs.GetInt32(rs.GetOrdinal("id"));
                        this.Tipo =rs.GetInt32(rs.GetOrdinal("id_tipo"));
                        this.NumFolio = rs.GetString(rs.GetOrdinal("num_folio"));
                        this.Latitud = rs.GetDouble(rs.GetOrdinal("latitud"));
                        this.Longitud = rs.GetDouble(rs.GetOrdinal("longitud"));
                        this.Tamano = rs.GetDouble(rs.GetOrdinal("tamano"));
                        this.Nombre = rs.GetString(rs.GetOrdinal("nombre"));
                        this.Habilitado = rs.GetInt32(rs.GetOrdinal("habilitado"));
                        this.UnidadMedida = rs.GetString(rs.GetOrdinal("unidad_medicion"));
                        this.TipoTerreno = rs.GetString(rs.GetOrdinal("tipo_terreno"));
                        this.Poblado = rs.GetString(rs.GetOrdinal("poblado"));
                        //Obtiene la localidad completa (Provincia, Canton, Distrito)
                        this.Localidad = new Localidad();
                        this.Localidad.getLocalicaXDistrito(rs.GetInt32(rs.GetOrdinal("id_distrito")));

                    }

                }catch(Exception ex){
                    throw new Exception("Ocurrio un error a la hora de obtener el terreno: "+ex.Message);
                }
            }
            
            /// <summary>
            /// Retorna una lista de terrenos
            /// </summary>
            /// <param name="pnombre"></param>
            /// <returns></returns>
            public List<Terreno> buscarXNombre(string pnombre)
            {
                string sqlQuery = "Select id,id_tipo,id_distrito,isnull(num_folio,0)num_folio,isnull(latitud,0) latitud,"+
                    "isnull(longitud,0) longitud, isnull(tamano,0) tamano,isnull(nombre,'Sin nombre') nombre,"+
                    "habilitado,unidad_medicion,tipo_terreno,isnull(poblado,'Sin poblado') poblado "+ 
                    "from Terrenos where nombre like '%" + pnombre + "%'";
                List<Terreno> nuevaListaTerrenos = new List<Terreno>();
                Terreno TempTerreno;

                try
                {
                    SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                    //llena la lista de terrenos con objetos Terreno
                    while (rs.Read())
                    {
                        TempTerreno = new Terreno();
                        TempTerreno.Id = rs.GetInt32(rs.GetOrdinal("id"));
                        TempTerreno.Tipo = rs.GetInt32(rs.GetOrdinal("id_tipo"));
                        TempTerreno.NumFolio = rs.GetString(rs.GetOrdinal("num_folio"));
                        TempTerreno.Latitud = rs.GetDouble(rs.GetOrdinal("latitud"));
                        TempTerreno.Longitud = rs.GetDouble(rs.GetOrdinal("longitud"));
                        TempTerreno.Tamano = rs.GetDouble(rs.GetOrdinal("tamano"));
                        TempTerreno.Nombre = rs.GetString(rs.GetOrdinal("nombre"));
                        TempTerreno.Habilitado = rs.GetInt32(rs.GetOrdinal("habilitado"));
                        TempTerreno.UnidadMedida = rs.GetString(rs.GetOrdinal("unidad_medicion"));
                        //Obtiene la localidad completa (Provincia, Canton, Distrito)
                        TempTerreno.Localidad = new Localidad();
                        TempTerreno.Localidad.getLocalicaXDistrito(rs.GetInt32(rs.GetOrdinal("id_distrito")));
                        TempTerreno.TipoTerreno = rs.GetString(rs.GetOrdinal("tipo_terreno"));
                        TempTerreno.Poblado = rs.GetString(rs.GetOrdinal("poblado"));
                        nuevaListaTerrenos.Add(TempTerreno);
                    }

                }
                catch (Exception ex)
                {
                    throw new Exception("Ocurrio un error a la hora de obtener el terreno: " + ex.Message);
                }
                return nuevaListaTerrenos;
            }

            public bool habilitarTerreno(bool pEstado) {
                bool result=false;
                int estado=pEstado?1:-1;//1:hablitado, -1:inhabilitado

                string sqlQuery="Upate Terreno set habilitado="+estado+" where id="+this.Id;

                try
                {
                    result = dba.executeSQL(sqlQuery, null);
                }
                catch (Exception ex) {
                    throw new Exception("Ocurrio un error a la hora de cambiar el estado del terreno: " + ex.Message);
                }

                return result;
            }

        //CRUD
            public bool ingresarTerreno() {
                bool result = false;

                try
                {


                    //Query
                    String sqlQuery = "Insert into Terrenos (id_tipo,latitud,longitud,tamano,nombre,habilitado,id_distrito,num_folio, unidad_medicion,tipo_terreno,poblado) values(param2,param3,param4,param5,param6,param7,param8,param9,param010,param011,param012)";

                    //Lista parametros
                    Parametros[] parametros = new Parametros[11];
                    parametros[0] = new Parametros(this.Tipo, "param2");
                    parametros[1] = new Parametros(this.Latitud, "param3");
                    parametros[2] = new Parametros(this.Longitud, "param4");
                    parametros[3] = new Parametros(this.Tamano, "param5");
                    parametros[4] = new Parametros(this.Nombre, "param6");
                    parametros[5] = new Parametros(this.Habilitado, "param7");
                    parametros[6] = new Parametros(this.Localidad.IdDistrito, "param8");
                    parametros[7] = new Parametros(this.NumFolio, "param9");
                    parametros[8] = new Parametros(this.UnidadMedida, "param010");
                    parametros[9] = new Parametros(this.TipoTerreno, "param011");
                    parametros[10] = new Parametros(this.Poblado, "param012");

                    int idReturn = dba.executeSQLInsert(sqlQuery, parametros);
                    //Le asigna el id generado
                    this.Id = idReturn;
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Ocurrio un error a la hora de ingresar el terreno: " + ex.Message);
                }

                return result;
                
            }


            public bool borrarTerreno()
            {
                bool result = false;

                try
                {
                    //@@Pendiente :Debe de borrar todos sus segmentos

                    //Query
                    String sqlQuery = "delete Terrenos where id="+this.Id;
                    //Ejectuta el query
                    result = dba.executeSQL(sqlQuery, null);

                }
                catch (Exception ex)
                {
                    throw new Exception("Ocurrio un error a la hora de borrar el terreno: " + ex.Message);
                }

                return result;

            }


            public bool actualizarTerreno()
            {
                bool result = false;

                try
                {


                    //Query
                    String sqlQuery = "update Terrenos set id_tipo=param1,latitud=param2,longitud=param3,tamano=param4,nombre=param5,habilitado=param6,id_distrito=param7,num_folio=8,tipo_terreno=param9 where id="+this.Id;

                    //Lista parametros
                    Parametros[] parametros = new Parametros[9];
                    parametros[0] = new Parametros(this.Tipo, "param1");
                    parametros[1] = new Parametros(this.Latitud, "param2");
                    parametros[2] = new Parametros(this.Longitud, "param3");
                    parametros[3] = new Parametros(this.Tamano, "param4");
                    parametros[4] = new Parametros(this.Nombre, "param5");
                    parametros[5] = new Parametros(this.Habilitado, "param6");
                    parametros[6] = new Parametros(this.Localidad.IdDistrito, "param7");
                    parametros[7] = new Parametros(this.NumFolio, "param8");
                    parametros[8] = new Parametros(this.TipoTerreno, "param9");

                    //Ejecuta el query
                    result = dba.executeSQL(sqlQuery, parametros);

                }
                catch (Exception ex)
                {
                    throw new Exception("Ocurrio un error a la hora de actualizar el terreno: " + ex.Message);
                }

                return result;

            }




        #endregion
    }

}

    